/**
 * 根据身份证号获取性别
 * @param idCard 身份证号码（15位或18位）
 * @returns '男' | '女' | null 无效身份证号返回null
 */
export const getGenderByIdCard = (idCard: string): '男' | '女' | null => {
    if (!isValidIdCard(idCard)) return null;
    
    // 统一处理18位格式（15位身份证需要补全）
    const fullIdCard = idCard.length === 15 ? convert15To18IdCard(idCard) : idCard;
    
    // 获取第17位（倒数第二位）
    const genderDigit = parseInt(fullIdCard.slice(16, 17), 10);
    
    // 判断奇偶性
    return genderDigit % 2 === 1 ? '男' : '女';
  };
  
  /**
   * 根据身份证号获取年龄
   * @param idCard 身份证号码（15位或18位）
   * @returns number 年龄，无效身份证号返回-1
   */
  export const getAgeByIdCard = (idCard: string): number => {
    if (!isValidIdCard(idCard)) return -1;
    
    // 统一处理18位格式
    const fullIdCard = idCard.length === 15 ? convert15To18IdCard(idCard) : idCard;
    
    // 提取出生年月日
    const birthYear = parseInt(fullIdCard.slice(6, 10), 10);
    const birthMonth = parseInt(fullIdCard.slice(10, 12), 10);
    const birthDay = parseInt(fullIdCard.slice(12, 14), 10);
    
    const today = new Date();
    const currentYear = today.getFullYear();
    const currentMonth = today.getMonth() + 1;
    const currentDay = today.getDate();
    
    // 计算年龄
    let age = currentYear - birthYear;
    
    // 如果今年生日还没过，年龄减1
    if (currentMonth < birthMonth || (currentMonth === birthMonth && currentDay < birthDay)) {
      age--;
    }
    
    return age;
  };
  
  /**
   * 根据身份证号获取生日（格式：YYYY-MM-DD）
   * @param idCard 身份证号码（15位或18位）
   * @returns string 生日字符串，无效身份证号返回null
   */
  export const getBirthdayByIdCard = (idCard: string): string | null => {
    if (!isValidIdCard(idCard)) return null;
    
    // 统一处理18位格式
    const fullIdCard = idCard.length === 15 ? convert15To18IdCard(idCard) : idCard;
    
    // 提取年月日
    const year = fullIdCard.slice(6, 10);
    const month = fullIdCard.slice(10, 12);
    const day = fullIdCard.slice(12, 14);
    
    return `${year}-${month}-${day}`;
  };
  
  /**
   * 校验身份证号基本格式
   */
  const isValidIdCard = (idCard: string): boolean => {
    if (!idCard) return false;
    
    // 15位或18位
    if (idCard.length !== 15 && idCard.length !== 18) return false;
    
    // 18位身份证最后一位可能是X
    if (idCard.length === 18) {
      const regex = /^\d{17}[\dXx]$/;
      if (!regex.test(idCard)) return false;
    }
    
    // 15位身份证全数字
    if (idCard.length === 15) {
      const regex = /^\d{15}$/;
      if (!regex.test(idCard)) return false;
    }
    
    return true;
  };
  
  /**
   * 将15位身份证转换为18位
   */
  const convert15To18IdCard = (idCard15: string): string => {
    if (idCard15.length !== 15) return idCard15;
    
    // 在年份前加19，变成6位年份
    const idCard17 = idCard15.slice(0, 6) + '19' + idCard15.slice(6);
    
    // 计算校验码
    const checkCode = calculateCheckCode(idCard17);
    
    return idCard17 + checkCode;
  };
  
  /**
   * 计算18位身份证的校验码
   */
  const calculateCheckCode = (idCard17: string): string => {
    if (idCard17.length !== 17) return '';
    
    // 权重系数
    const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    // 校验码对应表
    const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    
    let sum = 0;
    for (let i = 0; i < 17; i++) {
      sum += parseInt(idCard17[i], 10) * factors[i];
    }
    
    const mod = sum % 11;
    return checkCodes[mod];
  };